home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok50
/
brushtooberon
/
brushtooberon.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
16KB
|
512 lines
(*---------------------------------------------------------------------------
:Program. BrushToOberon.mod
:Contents. Converts IFF brushes to oberon source code
:Author. Christian Stiens
:Address. Heustiege 2, W-4710 Lüdinghausen
:Copyright. PD
:Language. Oberon
:Translator. Amiga Oberon V1.17.1 A+L
:History. V1.0, 07-Mar-91
:Usage. BrushToOberon {[-i|-s|-p|-d] <iff-file>} TO <source-file>
---------------------------------------------------------------------------*)
MODULE BrushToOberon;
(* $NilChk- $CaseChk- $ReturnChk- $OvflChk- $RangeChk- $StackChk- *)
IMPORT
a : Arguments,
s : SYSTEM,
g : Graphics,
fs : FileSystem,
st : Strings,
e : Exec,
c : Conversions,
ol : OberonLib,
io;
CONST (* Error messages *)
writeerr = "Write error\n";
readerr = "Read error\n";
nomem = "Out of memory\n";
badIFF = "Bad IFF format\n";
noinput = "Can't open input file\n";
nooutput = "Can't open output file\n";
usage = "Usage: BrushToOberon {[-i|-s|-p|-d] <iff-file>} TO <source-file>\n";
CONST (* Masking *)
mskNone = 0;
mskHasMask = 1;
mskHasTransparentColor = 2;
mskLasso = 3;
CONST (* Compression *)
cmpNone = 0;
cmpByteRun = 1;
TYPE
BitMapHeader = STRUCT
width,height : INTEGER;
x,y : INTEGER;
nPlanes : SHORTINT;
masking : SHORTINT;
compression : SHORTINT;
pad1 : SHORTINT;
transparentColor : INTEGER;
xAspect,yAspect : SHORTINT;
pageWidth,pageHeight : INTEGER;
END;
CONST (* Action *)
copy = 0;
extend = 1;
nop = 2;
VAR
bm : g.BitMap;
wordPtr : POINTER TO INTEGER;
bytePtr : POINTER TO SHORTINT;
arg,name : ARRAY 80 OF CHAR;
modname : ARRAY 80 OF CHAR;
argNr : INTEGER;
wordStr : ARRAY 8 OF CHAR;
in,out : fs.File;
chunk,id,len: LONGINT;
buf : POINTER TO BYTE;
bmhd : BitMapHeader;
bmhdFlag : BOOLEAN;
maskPlane : INTEGER;
sprite,proc : BOOLEAN;
wordsPerLine: INTEGER;
size : LONGINT;
x,y,z,i,col : INTEGER;
numArgs : INTEGER;
compressed : BOOLEAN;
zaehler : INTEGER;
store,action: SHORTINT;
CONST
iconSize = 781;
PROCEDURE * IconData; (* $EntryExitCode- *)
BEGIN s.INLINE(
0E310H,00001H,00000H,00000H,000CCH,0000CH,0002AH,0001BH,00006H,00001H,
00001H,000C1H,0B6A0H,000C1H,0B778H,00004H,099A6H,00000H,00000H,00000H,
00000H,00064H,00000H,00001H,0045CH,000C1H,0B5B0H,00000H,00000H,08000H,
00000H,08000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
00000H,0002AH,0001BH,00002H,00001H,09B30H,00300H,00000H,00000H,00FFFH,
0FFFFH,0FC00H,01000H,00000H,01200H,01000H,00000H,01200H,017FFH,09FF0H,
01200H,01000H,00000H,01C00H,01673H,0C000H,01000H,01000H,00000H,01000H,
017B9H,09F80H,01000H,01000H,00000H,01000H,01667H,00000H,01000H,01000H,
00000H,01000H,017FFH,03C00H,01000H,01000H,00000H,01000H,01700H,00000H,
01000H,01000H,00000H,01000H,0139CH,0C000H,01000H,01000H,00000H,01000H,
010E7H,0C000H,01000H,01000H,00000H,01000H,01380H,00000H,01000H,01000H,
00000H,01000H,07FFFH,0FFFFH,0D000H,08000H,00000H,09000H,08000H,00000H,
09000H,08000H,00000H,09000H,07FFFH,0FFFFH,0E000H,00000H,00000H,00000H,
00000H,00000H,00000H,00FFFH,0FFFFH,0EC00H,00FFFH,0FFFFH,0EC00H,00800H,
0600FH,0EC00H,00FFFH,0FFFFH,0E000H,0098CH,03FFFH,0E000H,00FFFH,0FFFFH,
0E000H,00846H,0607FH,0E000H,00FFFH,0FFFFH,0E000H,00998H,0FFFFH,0E000H,
00FFFH,0FFFFH,0E000H,00800H,0C3FFH,0E000H,00FFFH,0FFFFH,0E000H,008FFH,
0FFFFH,0E000H,00FFFH,0FFFFH,0E000H,00C63H,03FFFH,0E000H,00FFFH,0FFFFH,
0E000H,00F18H,03FFFH,0E000H,00FFFH,0FFFFH,0E000H,00C7FH,0FFFFH,0E000H,
00FFFH,0FFFFH,0E000H,00000H,00000H,02000H,07FFFH,0FFFFH,06000H,07FFFH,
0FFFFH,06000H,07FFFH,0FFFFH,06000H,00000H,00000H,00000H,00000H,00000H,
00000H,00000H,00000H,0002AH,0001BH,00002H,00001H,09C78H,00300H,00000H,
00000H,00FFFH,0FFFFH,0FC00H,01000H,00000H,01200H,01000H,00000H,01200H,
017FFH,09FF0H,01200H,01000H,00000H,01C00H,01673H,0C000H,01000H,01000H,
00000H,01000H,017B9H,09F80H,01000H,01000H,00000H,01000H,01667H,00000H,
01000H,01000H,00080H,01000H,017FFH,03C78H,01000H,01000H,0007EH,01000H,
01700H,0007FH,01000H,01000H,0007CH,09000H,0139CH,0C074H,05000H,01000H,
00022H,03000H,010E7H,0C011H,01000H,01000H,00008H,08800H,01380H,00004H,
04400H,01000H,00002H,02200H,07FFFH,0FFFFH,01100H,08000H,00000H,08880H,
08000H,00000H,0C480H,08000H,00000H,06380H,07FFFH,0FFFFH,0FE00H,00000H,
00000H,00000H,00000H,00000H,00000H,00FFFH,0FFFFH,0EC00H,00FFFH,0FFFFH,
0EC00H,00800H,0600FH,0EC00H,00FFFH,0FFFFH,0E000H,0098CH,03FFFH,0E000H,
00FFFH,0FFFFH,0E000H,00846H,0607FH,0E000H,00FFFH,0FFFFH,0E000H,00998H,
0FFFFH,0E000H,00FFFH,0FF7FH,0E000H,00800H,0C39FH,0E000H,00FFFH,0FFFDH,
0E000H,008FFH,0FFF8H,0E000H,00FFFH,0FFE3H,06000H,00C63H,03F8BH,0A000H,
00FFFH,0FFDDH,0C000H,00F18H,03FEEH,0E000H,00FFFH,0FFF7H,07000H,00C7FH,
0FFFBH,0B800H,00FFFH,0FFFDH,0DC00H,00000H,00000H,0EE00H,07FFFH,0FFFFH,
07700H,07FFFH,0FFFFH,03B00H,07FFFH,0FFFFH,09C00H,00000H,00000H,00000H,
00000H,00000H,00000H,00000H,0000BH,04F42H,04552H,04F4EH,03A4FH,04564H,
00000H)
END IconData;
PROCEDURE Read(VAR to: ARRAY OF BYTE);
BEGIN
IF NOT fs.Read(in,to) THEN
io.WriteString(readerr);
HALT(0)
END;
END Read;
PROCEDURE WriteString(str: ARRAY OF CHAR); (* $CopyArrays- *)
BEGIN
IF NOT fs.WriteBlock(out,s.ADR(str),st.Length(str)) THEN
io.WriteString(writeerr);
HALT(0)
END;
END WriteString;
PROCEDURE WriteInt(i: LONGINT);
VAR str : ARRAY 40 OF CHAR;
j : LONGINT;
n : SHORTINT;
BEGIN
j := i; n := 1;
WHILE j >= 10 DO j := j DIV 10; INC(n) END;
IF c.IntToStr(i,str,10,n," ") THEN WriteString(str) END;
END WriteInt;
PROCEDURE Tab(n: LONGINT);
VAR str : ARRAY 10 OF CHAR;
BEGIN
str := " ";
IF n<10 THEN str[n] := 0X END;
WriteString(str);
END Tab;
PROCEDURE IffErr;
BEGIN
io.WriteString(badIFF); HALT(0)
END IffErr;
PROCEDURE Usage;
BEGIN
io.WriteString(usage); HALT(0)
END Usage;
PROCEDURE NextWord():INTEGER;
VAR uword : INTEGER;
ubyte : SHORTINT;
bytes : INTEGER;
n : SHORTINT;
BEGIN
IF NOT compressed THEN
Read(uword);
RETURN uword
END;
uword := 0; bytes := 0;
REPEAT
IF zaehler=0 THEN
Read(n);
IF n >= 0 THEN
zaehler := n+1;
action := copy;
ELSIF n # -128 THEN
zaehler:= (-n)+1;
action := extend;
Read(store);
ELSE
action := nop;
END;
ELSE
CASE action OF
| copy: Read(ubyte);
| extend: ubyte := store
| nop:
END;
(* $OvflChk- *)
uword := s.LSH(uword,8);
IF ubyte >= 0 THEN
uword := uword + ubyte
ELSE
uword := uword + (LONG(ubyte)+256)
END;
(* $OvflChk= *)
DEC(zaehler);
INC(bytes);
END;
UNTIL bytes=2;
RETURN uword;
END NextWord;
PROCEDURE Letter(ch:CHAR):BOOLEAN;
BEGIN
RETURN (CAP(ch) >="A") & (CAP(ch) <= "Z") OR (ch >="0") & (ch <= "9")
END Letter;
PROCEDURE ExtractName(VAR str: ARRAY OF CHAR); (* dev:name.ext -> Name *)
VAR i,j,k:INTEGER;
BEGIN
i:=st.Length(str);
LOOP
DEC(i); IF (i<0) OR (str[i]=":") OR (str[i]="/") THEN EXIT END;
END; j:=i;
LOOP
INC(j);
IF (j >= st.Length(str)) OR ~Letter(str[j]) THEN EXIT END
END; k:=0;
LOOP
INC(i); IF i=j THEN EXIT END;
str[k] := str[i]; INC(k);
END;
IF k < LEN(str) THEN str[k]:=0X END;
str[0] := CAP(str[0]);
END ExtractName;
PROCEDURE CreateBitMap;
VAR i: INTEGER;
BEGIN
g.InitBitMap(bm,bmhd.nPlanes,bmhd.width,bmhd.height);
i := 0; WHILE i < s.VAL(SHORTINT,bm.depth)+maskPlane DO
INCL(ol.MemReqs,e.chip);
ol.New(bm.planes[i],bm.bytesPerRow*bm.rows);
EXCL(ol.MemReqs,e.chip);
IF bm.planes[i] = NIL THEN
io.WriteString(nomem);
HALT(0)
END;
INC(i) END;
END CreateBitMap;
PROCEDURE FreeBitMap;
VAR i: INTEGER;
BEGIN
i := 0; WHILE i < s.VAL(SHORTINT,bm.depth)+maskPlane DO
IF bm.planes[i] # NIL THEN ol.Dispose(bm.planes[i]) END;
INC(i) END
END FreeBitMap;
PROCEDURE OpenOutFile(VAR numArgs: INTEGER);
VAR n : INTEGER;
BEGIN
n := 1;
WHILE n < a.NumArgs() DO
a.GetArg(n,arg); st.Upper(arg);
IF arg = "TO" THEN
a.GetArg(n+1,name);
IF fs.Open(out,name,TRUE) THEN
io.WriteString("Creating file ");
io.WriteString(name);
io.WriteString(" ...\n");
WriteString("MODULE ");
COPY(name,modname);
ExtractName(modname);
WriteString(modname);
WriteString("; (* $CodeChip+ $DataChip+ *)\n\n");
WriteString("IMPORT sys: SYSTEM;\n\n");
numArgs := n-1;
RETURN
ELSE
io.WriteString(nooutput); HALT(0)
END;
END;
INC(n);
END;
Usage;
END OpenOutFile;
BEGIN
proc := FALSE; sprite := FALSE;
a.GetArg(1,arg);
IF (a.NumArgs() = 0) OR (arg[0]="?") THEN Usage END;
OpenOutFile(numArgs);
argNr := 1;
WHILE argNr <= numArgs DO
a.GetArg(argNr,arg);
IF arg[0] = "-" THEN (* arg is option *)
i := 1;
WHILE i < st.Length(arg) DO
CASE CAP(arg[i]) OF
| "S": sprite := TRUE
| "I": sprite := FALSE
| "P": proc := TRUE
| "D": proc := FALSE
ELSE
END;
INC(i)
END;
ELSE (* arg is file *)
IF fs.Open(in,arg,FALSE) THEN
ExtractName(arg);
Read(chunk); IF chunk # s.VAL(LONGINT,"FORM") THEN IffErr END;
Read(len);
Read(id); IF id # s.VAL(LONGINT,"ILBM") THEN IffErr END;
zaehler := 0;
bmhdFlag := FALSE;
LOOP
Read(chunk); Read(len);
IF ODD(len) THEN INC(len) END;
IF chunk = s.VAL(LONGINT,"BODY") THEN
IF NOT bmhdFlag THEN IffErr END;
wordsPerLine := (bmhd.width+15) DIV 16;
compressed := (bmhd.compression=cmpByteRun);
IF bmhd.masking=mskHasMask THEN
maskPlane := 1
ELSE
maskPlane := 0
END;
size := wordsPerLine * bmhd.height * bmhd.nPlanes;
CreateBitMap;
y := 0; WHILE y < bm.rows DO
z := 0; WHILE z < s.VAL(SHORTINT,bm.depth)+maskPlane DO
wordPtr := bm.planes[z] + y * bm.bytesPerRow;
x := 0; WHILE x < wordsPerLine DO
wordPtr^ := NextWord();
INC(wordPtr,2);
INC(x) END;
INC(z) END;
INC(y) END;
WriteString("CONST "); WriteString(arg); WriteString("Size * = ");
WriteInt(size * 2); WriteString("; (* ");
WriteInt(bmhd.width); WriteString(" x ");
WriteInt(bmhd.height); WriteString(" x ");
WriteInt(bmhd.nPlanes);
WriteString(" *)\n\n");
IF proc THEN
WriteString("PROCEDURE "); WriteString(arg);
WriteString("Data * ; (* $EntryExitCode- *)\n");
WriteString("BEGIN sys.INLINE(\n");
ELSE
WriteString("TYPE IntArray"); WriteInt(size);
WriteString(" = ARRAY "); WriteInt(size);
WriteString(" OF INTEGER;\n\n");
WriteString("CONST ");
WriteString(arg); WriteString("Data * = IntArray");
WriteInt(size); WriteString("(\n");
END;
IF sprite THEN
y := 0; WHILE y < bm.rows DO
Tab(2);
z := 0; WHILE z < s.VAL(SHORTINT,bm.depth) DO
wordPtr := bm.planes[z] + y * bm.bytesPerRow;
x := 0; WHILE x < wordsPerLine DO
IF c.IntToHex(wordPtr^,wordStr,5) THEN END;
wordStr[0] := "0";
IF ~proc THEN wordStr[5] := "U" END;
WriteString(wordStr);
IF (z+1=s.VAL(SHORTINT,bm.depth))&(y+1=bm.rows)&(x+1=wordsPerLine) THEN
WriteString(");")
ELSE
WriteString(",")
END;
INC(wordPtr,2);
INC(x) END;
INC(z) END;
WriteString("\n");
INC(y) END;
ELSE
z := 0; WHILE z < s.VAL(SHORTINT,bm.depth) DO
y := 0; WHILE y < bm.rows DO
wordPtr := bm.planes[z] + y * bm.bytesPerRow;
Tab(2);
x := 0; WHILE x < wordsPerLine DO
IF c.IntToHex(wordPtr^,wordStr,5) THEN END;
wordStr[0] := "0";
IF ~proc THEN wordStr[5] := "U" END;
WriteString(wordStr);
IF (z+1=s.VAL(SHORTINT,bm.depth))&(y+1=bm.rows)&(x+1=wordsPerLine) THEN
WriteString(");")
ELSE
WriteString(",")
END;
INC(wordPtr,2);
INC(x) END;
WriteString("\n");
INC(y) END;
INC(z) END;
END; (* IF *)
IF proc THEN
WriteString("END ");
WriteString(arg);
WriteString("Data;\n\n");
ELSE
WriteString("\n\n");
END;
FreeBitMap;
EXIT;
END;
buf := e.AllocMem(len,LONGSET{e.public});
IF buf # NIL THEN
IF NOT fs.ReadBlock(in,buf,len) THEN
io.WriteString(readerr); HALT(0)
END;
IF chunk = s.VAL(LONGINT,"BMHD") THEN
e.CopyMem(buf^,bmhd,s.SIZE(bmhd));
bmhdFlag := TRUE;
ELSIF chunk = s.VAL(LONGINT,"CMAP") THEN
size := len DIV 3;
WriteString("TYPE IntArray"); WriteInt(size);
WriteString(" = ARRAY "); WriteInt(size);
WriteString(" OF INTEGER;\n\n");
WriteString("CONST ");
WriteString(arg); WriteString("Cols * = IntArray");
WriteInt(size); WriteString("(\n");
col := 0;
bytePtr := s.VAL(LONGINT,buf);
x := 0;
WHILE x < len DO
INC(x);
col := s.LSH(col,4) + s.LSH(bytePtr^,-4);
INC(bytePtr);
IF x MOD 3 = 0 THEN
IF c.IntToHex(col,wordStr,4) THEN END;
wordStr[0] := "0";
Tab(2);
WriteString(wordStr);
IF x+3 <= len THEN
WriteString(",")
ELSE
WriteString(");\n")
END;
WriteString("\n");
col := 0;
END;
END;
END;
e.FreeMem(buf,len);
ELSE
io.WriteString(nomem);
HALT(0)
END; (* IF buf # NIL *)
END; (* LOOP *)
IF fs.Close(in) THEN END;
ELSE
io.WriteString(noinput);
END; (* IF fs.Open *)
END; (* IF arg[0] = "-" *)
INC(argNr);
END; (* WHILE *)
WriteString("END "); WriteString(modname); WriteString(".\n");
IF fs.Close(out) THEN END; (* Empty buffer & close file *)
st.Append(name,".info");
IF fs.Open(out,name,TRUE) &
fs.WriteBlock(out,IconData,iconSize) &
fs.Close(out) THEN
END;
io.WriteString("--- Done\n");
END BrushToOberon.